package base.thread_JUC2.chapter04.demo09;

import java.util.Date;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 对执行器中的任务做一些后续处理操作，比如释放资源等。需要重写 FutureTask#done()方法。
 * 执行器中的每一个任务（不管是正常结束还是被取消），结束后FutureTask类都会去执行done()方法.通过done()方法可以关闭系统资源，发送日志信息等
 */
public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        // 创建执行器
        ThreadPoolExecutor pool = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);

        // 构造5个任务,并交由执行器执行
        ResultTask[] tasks = new ResultTask[5];
        for (int i = 0; i < 5; i++) {
            tasks[i] = new ResultTask(new ExecutableTask("ExecutableTask_"+i));
            pool.submit(tasks[i]);
        }

        System.out.println("Main 开始休眠："+new Date());
        // 主线程休眠5s
        TimeUnit.SECONDS.sleep(5);
        System.out.println("Main 休眠结束："+new Date());

        // 取消任务
        for (int i = 0; i < tasks.length; i++) {
            tasks[i].cancel(true);
        }

        // 遍历任务是否都被取消掉
        for (int i = 0; i < tasks.length; i++) {
            if (!tasks[i].isCancelled()) {
                System.out.printf("%s\n", tasks[i].get());
            }
        }

        // 关闭执行器
        pool.shutdown();
    }
}
